package iface.aplicativo.apresentacao.controle;

import iface.aplicativo.excecao.MensagemException;
import iface.aplicativo.negocio.aps.ManterDadosEmpresaAPS;
import iface.aplicativo.negocio.entidade.Empresa;
import iface.aplicativo.negocio.entidade.Endereco;
import iface.aplicativo.negocio.entidade.MeioComunicacao;
import iface.aplicativo.negocio.entidade.Pessoa;
import iface.aplicativo.util.BeanAbstrato;
import iface.arquitetura.utilitario.ListaTO;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Collection;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.apache.commons.io.FileUtils;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import com.sun.faces.context.ExternalContextImpl;

@ManagedBean
@SessionScoped
public class ManterDadosEmpresaBean extends BeanAbstrato implements
		Serializable {

	private static final long serialVersionUID = 4285899560377776076L;

	private Empresa empresa;
	private StreamedContent imagem;
	private StreamedContent logoEmpresa;
	private String nomeArquivoSelecionado;

	@ManagedProperty(value = "#{manterDadosEmpresaAPS}")
	private ManterDadosEmpresaAPS service;

	public void setService(ManterDadosEmpresaAPS service) {
		this.service = service;
	}

	public Collection<ListaTO> getTodasUfs() throws Exception {
		return this.service.consultarTodasUfs();
	}

	public void salvarEmpresa() throws Exception {

		try {
			String msg = this.service.salvarEmpresa(this.getEmpresa());
			this.limparCampos();

			this.setMensagem(msg, MSG_TIPO_INFORMACAO, "");
		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public void limparCampos() {
		this.setEmpresa(null);
	}

	public void handleFileUpload(FileUploadEvent event) {
		try {
			setNomeArquivoSelecionado(event.getFile().getFileName());

			ExternalContextImpl contexto = (ExternalContextImpl) FacesContext
					.getCurrentInstance().getExternalContext();
			String caminho = contexto.getRealPath("/img/LogoEmpresaTemp.jpg");

			File logo = new File(caminho);
			FileUtils.writeByteArrayToFile(logo, event.getFile().getContents());

			InputStream logoInput = new FileInputStream(caminho);
			imagem = new DefaultStreamedContent(logoInput);

		} catch (IOException ex) {
			this.setMensagem("Ocorreu um erro ao obter a imagem.",
					MSG_TIPO_ERRO, "");
		}
	}

	public Empresa getEmpresa() throws IOException {
		ExternalContextImpl contexto = (ExternalContextImpl) FacesContext
				.getCurrentInstance().getExternalContext();
		String caminho = contexto.getRealPath("/img/LogoEmpresa.jpg");
		String caminhoTemp = contexto.getRealPath("/img/LogoEmpresaTemp.jpg");

		File img = new File(caminho);

		if (empresa == null) {
			empresa = this.service.consultarEmpresa();
			if (empresa == null) {
				empresa = new Empresa();
				empresa.setPessoa(new Pessoa());
				empresa.getPessoa().setEndereco(new Endereco());
				empresa.getPessoa().setMeioComunicacao(new MeioComunicacao());
			} else {
				if (empresa.getPessoa().getEndereco() == null) {
					empresa.getPessoa().setEndereco(new Endereco());
				}
				if (empresa.getPessoa().getMeioComunicacao() == null) {
					empresa.getPessoa().setMeioComunicacao(
							new MeioComunicacao());
				}
			}

			File imagemTemp = new File(caminhoTemp);
			FileUtils.copyFile(img, imagemTemp);
		}

		InputStream logo = new FileInputStream(caminhoTemp);
		imagem = new DefaultStreamedContent(logo);

		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public String getNomeArquivoSelecionado() {
		return nomeArquivoSelecionado;
	}

	public void setNomeArquivoSelecionado(String nomeArquivoSelecionado) {
		this.nomeArquivoSelecionado = nomeArquivoSelecionado;
	}

	public StreamedContent getImagem() {
		return imagem;
	}

	public void setImagem(StreamedContent imagem) {
		this.imagem = imagem;
	}

	public StreamedContent getLogoEmpresa() throws FileNotFoundException {
		ExternalContextImpl contexto = (ExternalContextImpl) FacesContext
				.getCurrentInstance().getExternalContext();
		String caminho = contexto.getRealPath("/img/LogoEmpresa.jpg");

		InputStream logo = new FileInputStream(caminho);
		logoEmpresa = new DefaultStreamedContent(logo);

		return logoEmpresa;
	}

	public void setLogoEmpresa(StreamedContent logoEmpresa) {
		this.logoEmpresa = logoEmpresa;
	}

}
